import { Agent } from '@mastra/core/agent';
import { LibSQLStore } from '@mastra/libsql';
import { Memory } from '@mastra/memory';
import { createModel } from '../provider/model';
import { scoringTool } from '../tools/scoring.tool';

/**
 * 推理评估Agent
 * 负责评估玩家的推理结果，提供详细的反馈和学习建议
 */
export const evaluationAgent = new Agent({
  name: 'Evaluation',
  description: 'Specialized agent for evaluating player deductions and providing detailed feedback',
  instructions: `
    你是一个专业的推理评估专家，专门负责评估侦探的推理结果并提供建设性的反馈。
    
    ## 核心职责
    1. **推理逻辑评分** - 评估推理过程的逻辑严密性和合理性
    2. **证据链分析** - 分析证据使用的有效性和完整性
    3. **反馈生成** - 提供详细的评估反馈和改进建议
    4. **学习建议** - 根据表现给出个性化的学习指导
    
    ## 评估维度
    
    ### 推理准确性 (40分)
    - **结论正确性**: 是否正确识别真凶 (20分)
    - **逻辑合理性**: 推理过程是否符合逻辑 (20分)
    
    ### 证据运用 (30分)
    - **证据完整性**: 是否充分利用了可用证据 (15分)
    - **证据相关性**: 所用证据是否与结论相关 (15分)
    
    ### 调查过程 (20分)
    - **调查深度**: 对话和线索收集的深入程度 (10分)
    - **调查广度**: 是否全面调查了所有嫌疑人 (10分)
    
    ### 时间效率 (10分)
    - **时间管理**: 在限定时间内的调查效率 (10分)
    
    ## 评分标准
    
    ### 优秀 (90-100分)
    - 正确识别真凶且推理逻辑严密
    - 充分利用关键证据，证据链完整
    - 调查过程系统全面，效率高
    - 展现出色的推理能力
    
    ### 良好 (80-89分)
    - 正确识别真凶，推理基本合理
    - 使用了大部分关键证据
    - 调查过程较为全面
    - 推理能力良好，有小的改进空间
    
    ### 及格 (60-79分)
    - 可能识别错误但推理过程有一定合理性
    - 使用了部分关键证据
    - 调查过程基本完整
    - 推理能力一般，需要提升
    
    ### 不及格 (0-59分)
    - 结论错误且推理过程混乱
    - 证据使用不当或不足
    - 调查过程不完整
    - 推理能力需要大幅提升
    
    ## 反馈原则
    
    ### 建设性反馈
    - 重点指出做得好的地方，增强信心
    - 具体指出改进点，避免泛泛而谈
    - 提供可操作的改进建议
    - 鼓励继续学习和实践
    
    ### 个性化指导
    - 根据玩家的具体表现定制建议
    - 识别玩家的强项和弱项
    - 提供针对性的练习建议
    - 推荐相关的学习资源
    
    ### 激励性语言
    - 使用积极正面的语言
    - 强调学习过程的价值
    - 鼓励面对挑战的勇气
    - 培养持续改进的心态
    
    ## 分析方法
    
    ### 推理路径分析
    - 追踪玩家的推理思路
    - 识别关键的推理节点
    - 评估逻辑跳跃的合理性
    - 分析结论的支撑强度
    
    ### 证据使用分析
    - 统计证据使用情况
    - 评估证据的重要性权重
    - 分析证据组合的有效性
    - 识别遗漏的关键证据
    
    ### 调查策略分析
    - 评估问题设计的有效性
    - 分析对话策略的合理性
    - 评估时间分配的效率
    - 识别调查盲点
    
    ## 学习建议类型
    
    ### 逻辑推理提升
    - 加强演绎推理训练
    - 练习归纳推理方法
    - 学习溯因推理技巧
    - 提高批判性思维能力
    
    ### 证据分析技能
    - 学习证据分类方法
    - 练习证据权重评估
    - 掌握证据链构建技巧
    - 提高证据验证能力
    
    ### 调查技巧改进
    - 优化问题设计策略
    - 提高观察细节能力
    - 加强时间管理技能
    - 学习系统性调查方法
    
    ## 工具使用指南
    
    始终使用 scoring 工具来执行评估任务：
    - evaluate_deduction: 评估推理结果
    - analyze_evidence_use: 分析证据使用
    - assess_investigation: 评估调查过程
    - generate_feedback: 生成详细反馈
    - suggest_improvements: 提供改进建议
    
    ## 输出标准
    
    ### 评估报告结构
    1. **总体评分**: 综合得分和等级评定
    2. **分项评分**: 各维度的详细得分
    3. **优点总结**: 表现突出的方面
    4. **改进建议**: 具体的提升方向
    5. **学习计划**: 个性化的学习建议
    
    ### 反馈质量要求
    - **具体性**: 避免模糊的评价，提供具体例子
    - **平衡性**: 既指出优点也指出不足
    - **可操作性**: 建议要具体可行
    - **激励性**: 保持积极正面的态度
    
    记住：你的目标是帮助玩家提高推理能力，享受推理的乐趣，建立学习的信心！
  `,
  model: createModel(),
  tools: { scoringTool },
  memory: new Memory({
    storage: new LibSQLStore({
      url: 'file:../evaluation.db',
    }),
  }),
});

/**
 * 推理评估Agent的便捷调用方法
 * @param deductionData 推理提交数据
 * @param caseData 案件数据
 * @param gameHistory 游戏历史
 * @returns 评估结果
 */
export async function evaluateDeduction(
  deductionData: {
    culpritId: string;
    reasoning: string;
    evidence: string[];
    confidence: number;
  },
  caseData: any,
  gameHistory: {
    discoveredClues: any[];
    conversationHistory: any[];
    timeUsed: number;
    totalTime: number;
  }
) {
  try {
    console.log('推理评估Agent开始评估推理结果...');
    
    // 构建评估上下文
    const evaluationContext = {
      deduction: deductionData,
      case: caseData,
      history: gameHistory,
      correctAnswer: {
        culpritId: caseData.case?.culpritId,
        culpritName: caseData.suspects?.find((s: any) => s.id === caseData.case?.culpritId)?.name
      }
    };
    
    // 构建评估请求
    const prompt = `请作为专业推理评估专家，对以下推理结果进行全面评估：
    
    ## 玩家推理结果
    - 选择的真凶：${deductionData.culpritId}
    - 推理过程：${deductionData.reasoning}
    - 支持证据：${deductionData.evidence.join(', ')}
    - 信心程度：${deductionData.confidence}%
    
    ## 正确答案
    - 真正的凶手：${evaluationContext.correctAnswer.culpritName} (ID: ${evaluationContext.correctAnswer.culpritId})
    
    ## 案件信息
    - 案件标题：${caseData.case?.title}
    - 案件描述：${caseData.case?.description}
    - 嫌疑人列表：${caseData.suspects?.map((s: any) => `${s.name}(${s.id})`).join(', ')}
    
    ## 调查过程数据
    - 发现线索数量：${gameHistory.discoveredClues.length}条
    - 对话轮次：${gameHistory.conversationHistory.length}次
    - 使用时间：${gameHistory.timeUsed}秒 / 总时间：${gameHistory.totalTime}秒
    - 时间效率：${Math.round((1 - gameHistory.timeUsed / gameHistory.totalTime) * 100)}%
    
    ## 发现的线索
    ${gameHistory.discoveredClues.map((clue: any, index: number) => 
      `${index + 1}. [${clue.type}] ${clue.description} (重要性: ${clue.importance}/10)`
    ).join('\n')}
    
    ## 对话摘要
    ${gameHistory.conversationHistory.slice(-10).map((conv: any, index: number) => 
      `${index + 1}. ${conv.role === 'detective' ? '侦探' : '嫌疑人'}: ${conv.content.substring(0, 80)}...`
    ).join('\n')}
    
    请使用 scoring 工具进行全面评估，包括：
    1. 推理准确性评分
    2. 证据运用分析
    3. 调查过程评估
    4. 详细反馈生成
    5. 个性化改进建议
    `;
    
    // 调用Agent
    const response = await evaluationAgent.streamVNext([
      {
        role: 'user',
        content: prompt,
      },
    ]);
    
    // 处理流式响应
    let textResult = '';
    for await (const chunk of response.textStream) {
      textResult += chunk;
    }
    
    console.log('推理评估Agent响应:', textResult);
    
    // 从工具调用结果中提取数据
    const toolCalls = response.toolCalls;
    if (toolCalls && toolCalls.length > 0) {
      console.log('评估工具调用成功:', toolCalls[0]);
      return {
        success: true,
        ...toolCalls[0].result,
        agentResponse: textResult
      };
    }
    
    // 如果没有工具调用，返回基础评估
    const isCorrect = deductionData.culpritId === evaluationContext.correctAnswer.culpritId;
    const basicScore = calculateBasicScore(isCorrect, deductionData, gameHistory);
    
    return {
      success: true,
      isCorrect,
      totalScore: basicScore,
      grade: getGradeFromScore(basicScore),
      feedback: generateBasicFeedback(isCorrect, deductionData, gameHistory),
      suggestions: generateBasicSuggestions(isCorrect, gameHistory),
      agentResponse: textResult
    };
    
  } catch (error) {
    console.error('推理评估Agent调用失败:', error);
    
    // 提供降级评估
    const isCorrect = deductionData.culpritId === caseData.case?.culpritId;
    
    return {
      success: false,
      isCorrect,
      totalScore: isCorrect ? 70 : 30,
      grade: isCorrect ? 'B' : 'D',
      feedback: isCorrect ? 
        '恭喜你找到了真凶！虽然评估系统暂时不可用，但你的推理是正确的。' :
        '很遗憾，你选择的嫌疑人不是真凶。评估系统暂时不可用，建议重新分析线索。',
      suggestions: [
        '继续练习推理技巧',
        '仔细分析所有线索',
        '提高观察细节的能力'
      ],
      error: error instanceof Error ? error.message : 'EVALUATION_ERROR',
      fallback: true
    };
  }
}

/**
 * 批量评估多个推理结果
 * @param evaluations 评估请求数组
 * @returns 评估结果数组
 */
export async function batchEvaluateDeductions(evaluations: any[]) {
  const results = [];
  
  for (const evaluation of evaluations) {
    try {
      const result = await evaluateDeduction(
        evaluation.deductionData,
        evaluation.caseData,
        evaluation.gameHistory
      );
      results.push(result);
    } catch (error) {
      console.error('批量评估失败:', error);
      results.push({
        success: false,
        error: error instanceof Error ? error.message : 'BATCH_EVALUATION_ERROR'
      });
    }
  }
  
  return results;
}

/**
 * 生成学习报告
 * @param evaluationHistory 历史评估记录
 * @returns 学习报告
 */
export function generateLearningReport(evaluationHistory: any[]) {
  if (evaluationHistory.length === 0) {
    return {
      totalGames: 0,
      averageScore: 0,
      improvement: 0,
      strengths: [],
      weaknesses: [],
      recommendations: ['开始你的第一个推理游戏！']
    };
  }
  
  const totalGames = evaluationHistory.length;
  const averageScore = evaluationHistory.reduce((sum, evaluation) => sum + (evaluation.totalScore || 0), 0) / totalGames;
  
  // 计算进步趋势
  const recentGames = evaluationHistory.slice(-5);
  const earlyGames = evaluationHistory.slice(0, 5);
  const recentAverage = recentGames.reduce((sum, evaluation) => sum + (evaluation.totalScore || 0), 0) / recentGames.length;
  const earlyAverage = earlyGames.reduce((sum, evaluation) => sum + (evaluation.totalScore || 0), 0) / earlyGames.length;
  const improvement = recentAverage - earlyAverage;
  
  // 分析强项和弱项
  const strengths = [];
  const weaknesses = [];
  
  const correctRate = evaluationHistory.filter(evaluation => evaluation.isCorrect).length / totalGames;
  if (correctRate > 0.7) {
    strengths.push('推理准确性高');
  } else if (correctRate < 0.4) {
    weaknesses.push('推理准确性需要提升');
  }
  
  const avgEvidenceUse = evaluationHistory.reduce((sum, evaluation) =>
    sum + (evaluation.evidenceScore || 0), 0) / totalGames;
  if (avgEvidenceUse > 80) {
    strengths.push('证据运用能力强');
  } else if (avgEvidenceUse < 60) {
    weaknesses.push('证据分析能力需要加强');
  }
  
  // 生成建议
  const recommendations = [];
  if (improvement > 5) {
    recommendations.push('保持良好的学习势头！');
  } else if (improvement < -5) {
    recommendations.push('建议回顾基础推理方法');
  }
  
  if (weaknesses.includes('推理准确性需要提升')) {
    recommendations.push('多练习逻辑推理，仔细分析证据');
  }
  if (weaknesses.includes('证据分析能力需要加强')) {
    recommendations.push('学习如何系统性地收集和分析证据');
  }
  
  return {
    totalGames,
    averageScore: Math.round(averageScore),
    improvement: Math.round(improvement),
    strengths,
    weaknesses,
    recommendations
  };
}

// 辅助函数
function calculateBasicScore(isCorrect: boolean, deductionData: any, gameHistory: any): number {
  let score = 0;
  
  // 准确性评分 (40分)
  if (isCorrect) {
    score += 40;
  }
  
  // 证据使用评分 (30分)
  const evidenceScore = Math.min((deductionData.evidence.length / 3) * 30, 30);
  score += evidenceScore;
  
  // 调查过程评分 (20分)
  const investigationScore = Math.min((gameHistory.conversationHistory.length / 8) * 20, 20);
  score += investigationScore;
  
  // 时间效率评分 (10分)
  const timeEfficiency = 1 - (gameHistory.timeUsed / gameHistory.totalTime);
  const timeScore = timeEfficiency * 10;
  score += timeScore;
  
  return Math.round(score);
}

function getGradeFromScore(score: number): string {
  if (score >= 90) return 'A';
  if (score >= 80) return 'B';
  if (score >= 70) return 'C';
  if (score >= 60) return 'D';
  return 'F';
}

function generateBasicFeedback(isCorrect: boolean, deductionData: any, gameHistory: any): string {
  if (isCorrect) {
    return `恭喜你成功找到了真凶！你的推理过程展现了良好的逻辑思维能力。你使用了${deductionData.evidence.length}条证据支持你的结论，进行了${gameHistory.conversationHistory.length}轮对话收集信息。继续保持这种系统性的调查方法！`;
  } else {
    return `这次推理虽然没有找到正确答案，但你的调查过程是有价值的。你收集了${gameHistory.discoveredClues.length}条线索，进行了${gameHistory.conversationHistory.length}轮对话。建议在下次调查中更仔细地分析证据之间的关联性。`;
  }
}

function generateBasicSuggestions(isCorrect: boolean, gameHistory: any): string[] {
  const suggestions = [];
  
  if (isCorrect) {
    suggestions.push('继续保持系统性的调查方法');
    suggestions.push('尝试挑战更高难度的案件');
  } else {
    suggestions.push('仔细分析所有收集到的线索');
    suggestions.push('注意证据之间的逻辑关联');
    suggestions.push('与每个嫌疑人都进行深入对话');
  }
  
  if (gameHistory.conversationHistory.length < 5) {
    suggestions.push('增加与嫌疑人的对话次数');
  }
  
  if (gameHistory.discoveredClues.length < 3) {
    suggestions.push('努力发现更多线索');
  }
  
  return suggestions;
}
